home *** CD-ROM | disk | FTP | other *** search
/ QuickTime - The Beta Release / QuickTime - The Beta Release.iso / Programming Stuff / Beta Read Me
Text File  |  1991-09-06  |  54KB  |  1,315 lines

  1. This README file details the changes to QuickTime™ since the Alpha CD.
  2.  
  3. Changes are detailed in the following manner.  There is a brief statement of the change.
  4. This is followed by the routines that were changed, added, or removed.  Then there is a
  5. discussion of what the change means to your application.
  6.  
  7.  
  8.  
  9. GESTALT
  10.  
  11.     The version number returned by Gestalt for QuickTime is the full version
  12.     specification ( version # byte, 2nd/3rd parts of version #, 
  13.     development/alpha/beta/release, stage of prerelease version ).
  14.     
  15.     The version number returned by the image compression manager and the component
  16.     manager are interface compatability versions of the form long = version #.
  17.     (ImageCompression version is 15, Component Manager version is 1)
  18.  
  19.  
  20.  
  21.  
  22.                         M  O  V  I  E  S      T  O  O  L  B  O  X
  23.  
  24. MISC NAME CHANGES
  25.  
  26.     The names of a few constants and field names changed...
  27.  
  28.     struct SoundDescription {
  29.     /*      NEW                                   OLD        */
  30.         long    descSize;                    long size;
  31.         long    dataFormat;                    long type;
  32.         long    resvd1;
  33.         long    resvd2;
  34.         short    version;
  35.         short    revlevel;
  36.         long    vendor;
  37.         short    numChannels;
  38.         short    sampleSize;
  39.         short    compressionID;
  40.         short    packetSize;
  41.         Fixed    sampleRate;
  42.     };
  43.  
  44.         ----------
  45.  
  46.         NEW CONSTANT NAME                    OLD CONSTANT NAME
  47.         
  48.         usageTrackInMovie                    trackUsageInMovie
  49.         usageTrackInPreview                    trackUsageInPreview
  50.         usageTrackInPoster                    trackUsageInPoster
  51.  
  52.         cmfDeleteCurFile                    createMovieFileDeleteCurFile
  53.         cmfDontCreateMovie                    createMovieFileDontCreateMovie
  54.         cmfDontOpenMovieFile                createMovieFileDontOpenMovieFile
  55.  
  56.  
  57. MOVIE TIMEBASES
  58.  
  59.     New routines for working with a movie's timebase.
  60.     
  61.         ----------
  62.  
  63.         ADDED:  pascal void SetMovieMasterTimeBase( Movie m, TimeBase tb,
  64.                     const TimeRecord *slaveZero);
  65.                     
  66.         ADDED:  pascal void SetMovieMasterClock( Movie m, Component clockMeister,
  67.                     const TimeRecord *slaveZero );
  68.     
  69.         ----------
  70.     
  71.     These calls are the same as their TimeBase.h counterparts, except that they work with the Movie's
  72.     timebase.  There is extra bookkeeping that must be performed when changing a movie's timebase 
  73.     in these ways (callbacks cancelled, etc).  You shouldn't call SetTimeBaseMasterTimeBase or
  74.     SetTimeBaseMasterClock on a movie's timebase, instead, use these calls.
  75.     
  76.     Since Callbacks are dependent on the MasterClock, changing the MasterClock or MasterTimeBase
  77.     of a TimeBase with CallBacks can be deadly.  Not for the weak of heart.
  78.  
  79.  
  80. TIMERECORD
  81.  
  82.     CompTimeValue has been renamed to Int64. There is no change in field meaning or location. Note, an Int64 is
  83.     now typedef'ed as a struct rather than an array for easier field access. 
  84.  
  85.         ----------
  86.  
  87.         OLD:    CompTimeValue long[2];
  88.  
  89.         NEW:    struct Int64 {
  90.                  long hi;
  91.                  long lo;
  92.                 };
  93.  
  94.         ----------
  95.  
  96.     The value field of the TimeRecord, which was previously a CompTimeValue, is now an Int64.
  97.  
  98.         ----------
  99.  
  100.         OLD:    struct TimeRecord {
  101.                  CompTimeValue value;
  102.                  TimeScale scale;
  103.                  TimeBase base;
  104.                 };
  105.  
  106.         NEW:    struct TimeRecord {
  107.                  Int64 value;
  108.                  TimeScale scale;
  109.                  TimeBase base;
  110.                 };
  111.  
  112.         ----------
  113.  
  114. VIDEO MEDIA GRAPHICS MODE
  115.  
  116.     Parameter change to Get/SetVideoMediaGraphicsMode
  117.     
  118.         ----------
  119.  
  120.         OLD:  pascal HandlerError GetVideoMediaGraphicsMode( MediaHandler mh,
  121.                             long *graphicsMode, long *opColor )
  122.         NEW:  pascal HandlerError GetVideoMediaGraphicsMode( MediaHandler mh,
  123.                             long *graphicsMode, RGBColor *opColor )
  124.                                                 ^^^^^^^^
  125.  
  126.         ----------
  127.  
  128.         OLD:  pascal HandlerError SetVideoMediaGraphicsMode( MediaHandler mh,
  129.                             long graphicsMode, long opColor )
  130.         NEW:  pascal HandlerError SetVideoMediaGraphicsMode( MediaHandler mh,
  131.                             long graphicsMode, const RGBColor *opColor )
  132.                                                ^^^^^^^^^^^^^^^^
  133.  
  134.         ----------
  135.  
  136.     When getting or setting the VideoMediaGraphicsMode, you must pass an RGBColor for the
  137.     opColor.
  138.  
  139.  
  140. SOUND MEDIA GRAPHICS MODE
  141.  
  142.     The Get/SetSoundMediaBalance calls allow you to set and store values for balance, BUT they 
  143.     have no effect on sound playback at this time.
  144.     
  145.  
  146. DISPLAY BOUNDS
  147.     
  148.     Calls were added to get the display bounds of a movie or track over a period of time.
  149.     
  150.         ----------
  151.     
  152.         ADDED:  pascal RgnHandle GetMovieSegmentDisplayBoundsRgn( Movie m, 
  153.                                             TimeValue time, TimeValue duration );
  154.     
  155.         ADDED:  pascal RgnHandle GetTrackSegmentMovieDisplayBoundsRgn( Track t, 
  156.                                             TimeValue time, TimeValue duration );
  157.     
  158.         ----------
  159.  
  160.         GONE:  pascal void GetMovieDimensions( Movie m, Fixed *width, Fixed *height );
  161.     
  162.         ----------
  163.  
  164.     Since the movie and track display bounds calls return the display bounds of the movie
  165.     or track at the current movie time, it was impossible to get the display bounds of
  166.     a movie or track over the whole movie or portion of the movie.  With
  167.     GetMovieSegmentDisplayBoundsRgn and GetTrackSegmentMovieDisplayBoundsRgn, you can now
  168.     get this information.  Both return a bounds rgn in the display coordinate system.
  169.     
  170.     GetMovieDimensions was removed.  This information can be obtained by either calling
  171.     GetMovieBox or the full region being occupied can be gotten by calling
  172.     GetMovieDisplayBoundsRgn or GetMovieSegmentDisplayBoundsRgn.
  173.     
  174.  
  175.  
  176. LOADTRACKINTORAM
  177.     
  178.     LoadTrackIntoRam was added to complement LoadMovieIntoRam and LoadMediaIntoRam.
  179.     
  180.         ----------
  181.     
  182.         ADDED:  pascal OSErr LoadTrackIntoRam(Track t, TimeValue when, TimeValue duration, long flags)
  183.  
  184.         ----------
  185.     
  186.     LoadTrackIntoRam loads a portion of the track into ram.
  187.     
  188.  
  189. STATUS ROUTINES
  190.  
  191.     Status routines were added so you can determine if a track is having trouble performing
  192.     its duties during MoviesTask.
  193.  
  194.         ----------
  195.     
  196.         ADDED:  pascal ComponentResult GetTrackStatus(Track t);
  197.  
  198.         ADDED:  pascal ComponentResult GetMovieStatus(Movie m, Track *firstProblemTrack);
  199.  
  200.         ----------
  201.     
  202.     GetTrackStatus returns the error code which is the last error the media encountered during playback.
  203.     It can only be cleared by the media when it believes the situation that caused the error has gone
  204.     away.  GetMovieStatus scans all active tracks of a movie and returns the error from the first
  205.     problem track along with the track itself.
  206.  
  207.  
  208. MOVIE POSTERS:
  209.     
  210.     Calls were added to deal with the display bounds of a poster.
  211.   
  212.         ----------
  213.     
  214.         ADDED:  pascal void GetPosterBox( Movie m, Rect *boxRect );
  215.         
  216.         ADDED:  pascal void SetPosterBox( Movie m, const Rect *boxRect );
  217.  
  218.         ----------
  219.     
  220.     Previously, it was close to impossible to get the bounds of the poster.  Since there is
  221.     no "Poster Mode", you could not get this spatial information from the movie spatial
  222.     routines.
  223.  
  224.     A movie file’s Poster is no longer automatically shown in Standard File.  Instead,
  225.     the Movie Preview component may be called to give the file a PICT thumbnail 
  226.     which is based on the movie’s poster frame.  In future versions of QuickTime, the
  227.     movie preview component may also add motion previews to a movie file.
  228.     
  229.     You may give a movie file a preview thumbnail that is unrelated to the poster frame
  230.     by calling the PICT Preview component to add a thumbnail that your application creates.
  231.     Read about preview components later in this document.
  232.     
  233.  
  234. MOVIE PREVIEWS
  235.     
  236.     GetMoviePreviewPict was removed.    
  237.  
  238.         ----------
  239.         
  240.         GONE: pascal PicHandle GetMoviePreviewPict ( Movie m, TimeValue time );
  241.         
  242.         ----------
  243.  
  244.     If you want a pict for the preview, use SetMoviePreviewMode to go into preview mode and
  245.     use GetMoviePict to make a pict.  If you want to preserve the mode prior to getting the pict,
  246.     bracket the above calls with GetMoviePreviewMode and SetMoviePreviewMode.
  247.     
  248.     A movie’s preview is never used for previewing a movie file in Standard File.  
  249.     The “preview” settings supported by the Movies Toolbox may be used for application-specific
  250.     needs.
  251.     
  252.     Read about preview components later in this document.
  253.  
  254.  
  255. COVER PROCS
  256.  
  257.     CoverProcs were added to give the application full control over what gets displayed when a
  258.     spatial track "goes away".  When time is in an empty portion of a track or past the duration
  259.     of a track, the display area that the track used to occupy must be erased.  CoverProcs allow
  260.     extra control for applications.
  261.     
  262.         ----------
  263.         
  264.         ADDED:  pascal void SetMovieCoverProcs(Movie m, 
  265.                             MovieRgnCoverProc uncoverProc, MovieRgnCoverProc coverProc, long refcon);
  266.     
  267.         ADDED:  typedef pascal OSErr (*MovieRgnCoverProc)(Movie m, RgnHandle changedRgn, long refcon);        
  268.     
  269.         ----------
  270.         
  271.     If no CoverProc is set (the default case), the display area uncovered by a track is erased using
  272.     the backColor, foreColor, and background pattern or pixpat, of the gworld when the movie's 
  273.     GWorld was set.  A movie's GWorld is implicitly set by a NewMovie… call or explicitly set
  274.     with SetMovieGWorld.
  275.  
  276.     When you call SetMovieGWorld explicitly or implicitly (by creating a new movie), the movie 
  277.     toolbox remembers the current foreground and background colors in the port along with the 
  278.     background pattern or pixpat. By default, it uses this information to erase any areas uncovered 
  279.     by tracks going away. You may instead install a movie uncover proc to do the erasing (or nothing 
  280.     if you like). You may also install a cover proc that is notified when the movie newly covers over 
  281.     a region.  This would be useful if you are actively drawing something behind the movie.
  282.     
  283.     Your cover proc should return an error value. If no error occured, return 0.
  284.  
  285. ACTIVE MOVIE SEGMENT
  286.     
  287.     Calls were added to set and get the current active movie segment.
  288.     
  289.         ----------
  290.         
  291.         ADDED:  pascal void SetMovieActiveSegment(Movie m, TimeValue startTime, TimeValue duration);
  292.         
  293.         ADDED:  pascal void GetMovieActiveSegment(Movie m, TimeValue *startTime, TimeValue *duration);
  294.     
  295.         ----------
  296.         
  297.     
  298.     The active movie segment is that portion of the movie that is to be played.  No samples outside
  299.     of this range will be displayed/played when MoviesTask is called.  This is very useful for
  300.     playing sections of a movie.  The active movie segment is not part of the information saved
  301.     with a movie.
  302.     
  303.     All times are in the movie's TimeScale.  To set the active movie segment to the entire movie,
  304.     use a start time of -1.  In this case, the duration is ignored.  The default active movie segment
  305.     is the entire movie.
  306.  
  307.     Attempting to set movie time to a value outside of the active segment range will result in
  308.     the time passed being pinned to the start or stop time of the active segment.
  309.  
  310.     Several other calls are affected by the active movie segment. They include
  311.         GotoBeginningOfMovie        - goes to the beginning of the active segment of the movie
  312.         GotoEndOfMovie                - goes to the end of the active segment of the movie.
  313.         IsMovieDone                    - bases its result on the active segment.
  314.         TrackTimeToMediaTime        - returns -1 if Track time is outside of active movie segment.
  315.  
  316.     Calling SetMoviePreviewMode(m,true) causes the active segment to be set to the segment of the movie
  317.     containing the preview. Calling SetMoviePreviewMode(m,false) causes the active segment to
  318.     be reset to the entire movie. PlayMoviePreview saves and restores the active segment for you.
  319.  
  320.     The next interesting time calls are also affected. They now respect the active segment by default.
  321.     This means that any next interesting time call will not return values outside of the range
  322.     of the active segment. You can override this by setting the "nextTimeIgnoreActiveSegment" bit
  323.     in the flags field of the interesting time calls.
  324.  
  325.  
  326.  
  327.  
  328. DISPOSE TRACK MEDIA
  329.  
  330.     For the sake of consistancy, RemoveTrackMedia is now DisposeTrackMedia
  331.  
  332.         ----------
  333.     
  334.         OLD:  pascal void RemoveTrackMedia( Media m )
  335.         NEW:  pascal void DisposeTrackMedia( Media m )
  336.                           ^^^^^^^
  337.         ----------
  338.     
  339.     
  340. INSTANTIATING MOVIES FROM HANDLES
  341.  
  342.     NewMovieFromResHandle and NewMoviePublicMovie are consolidated into NewMovieFromHandle.
  343.     MakePublicMovie changed its name to PutMovieIntoHandle;
  344.     
  345.     
  346.         ----------
  347.     
  348.         OLD:  pascal OSErr NewMovieFromResHandle( Movie *m, Handle publicMovie,
  349.                                                     short flags, Boolean *dataRefWasChanged )
  350.         NEW:  pascal OSErr NewMovieFromHandle( Movie *m, Handle freezeDriedMovie,
  351.                            ^^^^^^^^^^^^^^^^^^
  352.                                                     short flags, Boolean *dataRefWasChanged )
  353.         
  354.         ----------
  355.     
  356.         GONE: pascal Movie NewMoviePublicMovie( Handle publicMovie, long flags, Boolean *dataRefWasChanged );
  357.     
  358.         ----------
  359.     
  360.         OLD:  pascal OSErr MakePublicMovie( Movie m, Handle publicMovie )
  361.         NEW:  pascal OSErr PutMovieIntoHandle( Movie m, Handle freezeDriedMovie )
  362.                            ^^^^^^^^^^^^^^^^^^
  363.         ----------
  364.     
  365.     NewMovieFromHandle is used regardless of whether the handle is a resource or not.  If it is a 
  366.     resource, we do some extra work to make sure that DataRefs are properly maintained.  If you get
  367.     the movie from a resource, you should not detach it.  If you detach it, we won't know what file
  368.     it came from and we can't do all that nice DataRef self-referenced bookkeeping for you.
  369.     
  370.     The handle based routines are now NewMovieFromHandle and PutMovieIntoHandle.
  371.     
  372.     
  373. DEALING WITH THE SCRAP
  374.  
  375.     Routines were added to assist in dealing with the scrap.
  376.     
  377.         ----------
  378.         
  379.         ADDED:  pascal OSErr PutMovieOnScrap(Movie m, long someMoreFlags);
  380.  
  381.         ADDED:  pascal Movie NewMovieFromScrap(long newMovieFlags);
  382.         
  383.         ----------
  384.  
  385.     Use PutMovieOnScrap when you put a movie onto the scrap.  The MoviesToolbox will automatically
  386.     put the suggested resources onto the scrap (PICT as well as the movie).  By using this routine,
  387.     if there are other standard resources which should be put onto the scrap, it will happen automatically.
  388.  
  389.     PutMovieOnScrap takes a long of flags. Two flags are currently defined as shown below
  390.         enum {
  391.             movieScrapDontZeroScrap = 1<<0,
  392.             movieScrapOnlyPutMovie = 1<<1
  393.         };
  394.     If you set "movieScrapDontZeroScrap", PutMovieOnScrap will NOT call ZeroScrap before putting the movie on the
  395.     scrap. This is useful when you want to put data on the scrap before the movie. If you set "movieScrapOnlyPutMovie",
  396.     PutMovieOnScrap will only put movie data onto the scrap. If this flag is not set, PutMovieOnScrap may put other
  397.     kinds of data on the scrap as well, such as a Picture. The two flags to PutMovieOnScrap may be combined.
  398.  
  399.     NewMovieFromScrap will create a movie from the scrap. The flags are the same as you would pass to 
  400.     NewMovieFromFile or NewMovieFromHandle.
  401.  
  402.  
  403.  
  404.  
  405. MOVIE PROGRESS PROCS
  406.  
  407.     MovieProgressProcs now take a refcon and a message parameter.
  408.     
  409.         ----------
  410.     
  411.         OLD:  pascal void SetMovieProgressProc(Movie m, 
  412.                                             MovieProgressProcPtr p);
  413.         NEW:  pascal void SetMovieProgressProc(Movie m, 
  414.                                             MovieProgressProcPtr p, long refcon);
  415.                                                                     ^^^^^^^^^^^
  416.         ----------
  417.     
  418.         OLD:  typedef pascal Boolean (*MovieProgressProcPtr)(Movie m, 
  419.                         short whatOperation, Fixed percentDone);        
  420.         NEW:  typedef pascal Boolean (*MovieProgressProcPtr)(Movie m, 
  421.                         short message, short whatOperation, Fixed percentDone, long refcon);
  422.                         ^^^^^^^^^^^^^                                           ^^^^^^^^^^^
  423.         ----------
  424.                         
  425.         GONE: pascal MovieProgressProcPtr GetMovieProgressProc(Movie m);
  426.  
  427.         ----------
  428.  
  429.     The movie progress procs have changed in two ways.  GetMovieProgressProc is gone, your app
  430.     will have to remember what you set the movie progress proc to.  Second, the progress proc routines
  431.     now take two new parameters, refcon and message.  The refcon is available for your use and is
  432.     set in the SetMovieProgressProc routine.  The message is one of the three following constants:
  433.         enum {
  434.             movieProgressOpen = 0,
  435.             movieProgressUpdatePercent = 1,
  436.             movieProgressClose = 2
  437.         };
  438.     The first time your progress proc is called for a given opeation, the message "movieProgressOpen"
  439.     is sent. After that you will get one or more "movieProgressUpdatePercent" messages, and
  440.     finally a "movieProgressClose" when the operation is complete. Constants have
  441.     been defined for "whatOperation". They are as follows (the calls that could invoke them
  442.     are shown after the constant):
  443.     enum {
  444.             progressOpFlatten = 1,                FlattenMovie/FlattenMovieData
  445.             progressOpInsertTrackSegment,        InsertTrackSegment
  446.             progressOpInsertMovieSegment,        InsertMovieSegment
  447.             progressOpPaste,                    PastMovieSelection
  448.             progressOpAddMovieSelection,        AddMovieSelection
  449.             progressOpCopy,                        CopyMovieSelection (progress not yet implememented)
  450.             progressOpCut                        CutMovieSelection (progress not yet implememented)
  451.         };
  452.     The percentDone field is only meaningful with the "movieProgressUpdatePercent" message.
  453.     The return value is only looked at for the "movieProgressUpdatePercent" message.
  454.     
  455.  
  456. NO TRACK TIMESCALES
  457.  
  458.     Tracks no longer have their own track timescale (time coordinate system) or timebase.  Tracks use
  459.     the movie's timescale.
  460.  
  461.         ----------
  462.     
  463.         OLD:  pascal Track NewMovieTrack( Movie m, TimeValue movieTimeOffset,
  464.                             TimeScale timeScale, Fixed width, Fixed height );
  465.                             -------------------
  466.         NEW:  pascal Track NewMovieTrack( Movie m, Fixed width, Fixed height, short trackVolume);
  467.                                                                               ^^^^^^^^^^^^^^^^^
  468.         ----------
  469.     
  470.         OLD:  pascal Movie NewMovie( long flags, TimeScale timeScale )
  471.                                                  -------------------
  472.         NEW:  pascal Movie NewMovie( long flags );
  473.     
  474.         ----------
  475.         
  476.         GONE: pascal TimeScale GetTrackTimeScale( Track t )
  477.         GONE: pascal void SetTrackTimeScale( Track t, TimeScale timeScale )
  478.  
  479.         GONE: pascal TimeBase GetTrackTimeBase( Track t );
  480.         
  481.         GONE: pascal TimeValue GetTrackTime( Track t, TimeRecord *currentTime );
  482.         
  483.         GONE: pascal TimeValue GetMediaTime( Media m, TimeRecord *currentTime );
  484.         
  485.         ----------
  486.  
  487.     Since tracks no longer have their own timescale, the timescale parameter was removed from 
  488.     NewMovieTrack.  We also provide a resonable default timeScale when a movie is created with
  489.     NewMovie.  You can always change it by calling SetMovieTimeScale.
  490.     
  491.     The trackVolume parameter for NewMovieTrack should be zero for tracks without sound.
  492.  
  493.     A track's purpose in life is to map movie time to media time.  Tracks having their own independent
  494.     timescale did not make much sense.  Tracks now use the Movie's timescale when defining edits.  This 
  495.     eliminated a major problem encountered during editing.  If tracks had a timescale different from the
  496.     movie, it could be impossible to seam tracks temporally.  A track could easily not end on an
  497.     integral movie timevalue, but tracks could only begin on integral movie timevalues.  This made it 
  498.     impossible to reliably seam tracks in time (track B could not begin exactly when track A ended).
  499.     
  500.     Since most of you were creating tracks with the same timescale of the media, you will have to 
  501.     review your calls to InsertTrackMedia, which has been renamed InsertMediaIntoTrack.  Track durations
  502.     are no longer just the media duration.
  503.     
  504.     Since tracks do not have their own time coordinate system, there is no longer a movie offset
  505.     for each track.  Each track starts at time zero.  BUT, we have maintained the concept of a movie
  506.     offset for a track.  You can still get and set the movie offset for a track.  An offset translates
  507.     into the track starting with an empty segment.  If the track does not start with an empty segment,
  508.     the track has no movie offset (=zero).  Therefore, the movie offset is the duration of this
  509.     empty segment.  BUT, a track's duration includes this empty segment.  Therefore, the duration of the
  510.     active segment of a track is the track's duration minus its track offset/first empty segment.
  511.     
  512.     
  513.     
  514. INSERTTRACKMEDIA
  515.  
  516.     InsertTrackMedia changed its parameters and became InsertMediaIntoTrack.
  517.     
  518.     
  519.         ----------
  520.     
  521.         OLD:  pascal OSErr InsertTrackMedia( Track trackH, 
  522.                         TimeValue trackStart, TimeValue trackDuration, 
  523.                                               -----------------------
  524.                         TimeValue mediaStartTime, TimeValue mediaDuration);
  525.         NEW:  pascal OSErr InsertMediaIntoTrack( Track trackH,
  526.                         TimeValue trackStart, 
  527.                         TimeValue mediaStartTime, TimeValue mediaDuration,  Fixed mediaRate );
  528.                                                                             ^^^^^^^^^^^^^^^
  529.         ----------
  530.     
  531.     You don't have to calculate the track duration of the media you are adding anymore.  Instead
  532.     you tell us the rate to play the media.
  533.     
  534.     In addition, trackStart == -1 tells us to add to the end of the track.
  535.     
  536.  
  537. DATAREFS
  538.  
  539.     DataRefs have changed dramatically since the Alpha CD.  First of all, we allow for media
  540.     with multiple DataRefs (eg. a PICT media handler needs a data ref for every file it references).
  541.     Second, we try to be smarter about default data refs so that most applications do not
  542.     have to worry about DataRef's at all.
  543.     
  544.     Let's deal with the high-level routines which should make your life easier.
  545.  
  546.         ----------
  547.     
  548.         OLD:  pascal OSErr OpenMovieFile( const FSSpec *fileSpec, short *resRefNum, char perms,  
  549.                         MoviesDataRef *dataRefH );
  550.                         -----------------------
  551.         NEW:  pascal OSErr OpenMovieFile( const FSSpec *fileSpec, short *resRefNum, char perms);
  552.     
  553.         
  554.         
  555.         ----------
  556.     
  557.         OLD:  pascal OSErr CreateMovieFile( const FSSpec *fileSpec, OSType creator, 
  558.                             ScriptCode scriptTag, short flags );
  559.         NEW:  pascal OSErr CreateMovieFile( const FSSpec *fileSpec, OSType creator, 
  560.                             ScriptCode scriptTag, long flags, short *resRefNum, Movie *newmovie  );
  561.                                                   ^^^^          ^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^
  562.                             
  563.         ----------
  564.     
  565.         OLD:  pascal Media NewTrackMedia( Track t, long mediaType, 
  566.                             MoviesDataRef mediaDataRef, TimeScale timeScale)
  567.                             --------------------------
  568.         NEW:  pascal Media NewTrackMedia( Track t, OSType mediaType, 
  569.                                                    ^^^^^^
  570.                             TimeScale timeScale, Handle dataRef, OSType blobType );
  571.                                                  ^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^
  572.                             
  573.         ----------
  574.         
  575.         ADDED:  pascal OSErr DeleteMovieFile( const FSSpec *fileSpec );
  576.     
  577.         ADDED:  pascal OSErr RemoveMovieResource( short resRefNum, short resId );
  578.     
  579.         ----------
  580.                     
  581.     
  582.     The basic assumption is that when media is added to a movie, the data wants to be in the same
  583.     file as the movie resource.  Keeping this in mind, when you instantiate a movie using 
  584.     NewMovieFromHandle, we know what file it came from if the handle is a resource.  Because of this,
  585.     OpenMovieFile no longer returns a DataRef that you HAD to keep around when calling NewTrackMedia.
  586.     To handle the case in creation, we give you the ability to get a new movie back from 
  587.     CreateMovieFile (and this gives us a chance to remember the file the movie came from).  The flags
  588.     to CreateMovieFile now have creation related flags and new movie related flags (see the interface 
  589.     files for these flags).  You may also specify whether to return the refnum of the resource file
  590.     for the movie (this is the resRefNum to pass to AddMovieResource).
  591.     
  592.     NewTrackMedia takes the new form of data refs.  If nil is passed for the dataRef, the dataRef
  593.     the ToolBox remembers from CreateMovieFile or NewMovieFromHandle is used.  Therefore, in the normal
  594.     case, just pass nil for the dataRef to NewTrackMedia.
  595.     
  596.     DeleteMovieFile and RemoveMovieResource are used when expunging a movie file or movie resource.
  597.     We do some extra bookkeeping about what files are used by what movies, so use these calls instead
  598.     of FSpDelete and RmveResource.  If you don't, there will be extra resources left around in
  599.     your data files and your movie file.
  600.     
  601.     
  602.     Now we can go into the new form of data refs.  Data refs are blobs of data (Handles) that tell a
  603.     media where to get the data from.  A data ref consists of the blob of data, the blob type 
  604.     (what type of information is in the blob), and blob attributes.
  605.     
  606.     The current media handlers only use data refs which are Aliases.  Therefore, to create a
  607.     data ref today, just use NewAlias or NewAliasMinimal.  The type is 'alis'.  The only attribute
  608.     currently in use is Self-referenced (which means the data is in the same file as the movie resource).
  609.         
  610.     In addition, a media may now refer to more than one data ref.  Therefore, data refs are refered
  611.     to by index.  The architecture provides for multiple data refs, but the current implementations of
  612.     the media only support one data ref.
  613.  
  614.         ----------
  615.     
  616.         GONE: pascal MoviesDataRef NewDataRef( AliasHandle alias );
  617.     
  618.         GONE: pascal void DisposeDataRef(MoviesDataRef dataRef);
  619.     
  620.         GONE: pascal MoviesDataRef MakeMoviesDataRef(const FSSpec *theFile);
  621.     
  622.         GONE: pascal Boolean GetDataRefSelfReferenced( MoviesDataRef dataRef );
  623.     
  624.         GONE: pascal void SetDataRefSelfReferenced( MoviesDataRef dataRef, Boolean isSelfReferenced );
  625.     
  626.         GONE: pascal void SetDataRefAlias( MoviesDataRef dataRef, AliasHandle alias );
  627.     
  628.         GONE: pascal OSErr ResolveDataRef( MoviesDataRef dataRef, long flags, Boolean *dataRefWasChanged );
  629.     
  630.         GONE: pascal AliasHandle MakeAliasFromDataRef( MoviesDataRef dataRef );
  631.     
  632.         ----------
  633.  
  634.     The above calls are no longer needed.  Since data refs are just handles, we don't need special
  635.     constructor or destructor methods.  Since 'alis' data refs are just aliases, you can use the
  636.     alias manager to make the data ref blobs and resolve them.  Since self-referenced is now a bit
  637.     in a data ref's attributes, we don't need special calls just for self-referenced information.
  638.     
  639.     
  640.         ----------
  641.     
  642.         ADDED:  pascal OSErr GetMediaDataRefCount( Media media, short *count );
  643.     
  644.         ----------
  645.  
  646.         OLD:  pascal MoviesDataRef GetMediaDataRef( Media m )
  647.         NEW:  pascal OSErr GetMediaDataRef( Media media, short index, 
  648.                      ^^^^^                                 ^^^^^^^^^^^
  649.                                     Handle *blob, OSType *blobType, long *attributes );
  650.                                     ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^
  651.         ----------
  652.     
  653.         OLD:  pascal OSErr SetMediaDataRef( Media m, MoviesDataRef dataRef )
  654.         NEW:  pascal OSErr AddMediaDataRef( Media m, short *index, Handle blob, OSType blobType );
  655.                            ^^^                         ^^^^^^^^^^^^  ^^^^^^^^^^^  ^^^^^^^^^^^^^^^                        
  656.         ----------
  657.  
  658.     
  659.     Since media can have multiple data refs, you must request them by index.  GetMediaDataRefCount
  660.     returns the number of data refs a media has.  GetMediaDataRef now returns the 
  661.     blob, blobType, and blobAttributes of a dataref.  You may set any of these handles to nil
  662.     if you do not want the information.  For example, you may just want to look at the attributes or
  663.     types without actually reading in the data.
  664.  
  665.     SetMediaDataRef changed to AddMediaDataRef.  Once a media needs a DataRef, it will always need it.
  666.     Therefore, you can only add DataRefs.
  667.  
  668.         ----------
  669.     
  670.         OLD:  pascal void GetMediaDataHandlerDescription( Media m, 
  671.                                      long *type, Str255 *creatorName, long *creatorManufacturer )
  672.         NEW:  pascal void GetMediaDataHandlerDescription( Media m, 
  673.                         short index, OSType *type, Str255 creatorName, OSType *creatorManufacturer )
  674.                         ^^^^^^^^^^^  ^^^^^^                            ^^^^^^
  675.                                                  
  676.         ----------
  677.     
  678.         OLD:  pascal DataHandler GetMediaDataHandler( Media m )
  679.         NEW:  pascal DataHandler GetMediaDataHandler( Media m, short index )
  680.                                                                 ^^^^^^^^^^^
  681.         ----------
  682.         
  683.         OLD:  pascal OSErr SetMediaDataHandler( Media m, DataHandler dataHandler )
  684.         NEW:  pascal OSErr SetMediaDataHandler( Media m, short index, DataHandler dataHandler )
  685.                                                          ^^^^^^^^^^^
  686.         ----------
  687.  
  688.     For every DataRef, a media needs a DataHandler for it.  Therefore, you must access the data
  689.     handlers of a media by index as well.  The number of DataHandlers is the same as the number
  690.     of DataRefs, so use GetMediaDataRefCount to determine the maximum index for DataHandlers.
  691.  
  692. NEXT INTERESTING TIME
  693.  
  694.     There was a trivial change made to the interface for GetMovieNextInterestingTime.  What is
  695.     more interesting is that the next interesting time flags are more interesting and the 
  696.     interesting definitions follow.
  697.     
  698.         ----------
  699.         OLD:  pascal void GetMovieNextInterestingTime( Movie m, short flags, 
  700.                             short numMediaTypes, long *whichMediaTypes,
  701.                             TimeValue time, Fixed rate,
  702.                             TimeValue *interestingTime, TimeValue *interestingDuration );
  703.         NEW:  pascal void GetMovieNextInterestingTime( Movie m, short flags, 
  704.                             short numMediaTypes, const OSType *whichMediaTypes,
  705.                                                  ^^^^^^^^^^^^
  706.                             TimeValue time, Fixed rate,
  707.                             TimeValue *interestingTime, TimeValue *interestingDuration );
  708.         ----------
  709.  
  710.     While we are talking about next interesting time calls, let's discuss what all those different
  711.     flags mean.
  712.     
  713.     nextTimeMediaSample - returns time of the next media sample (not very useful for sound media)
  714.     nextTimeMediaEdit - returns time that the sample description changes (eg. when the compression
  715.                         type changes for Image Compression - 'RLE ' to 'RAW ')
  716.     nextTimeTrackEdit - returns time of the next track edit.  The end of the track is considered
  717.                         an edit.
  718.     nextTimeSyncSample - returns time of the next self-contained sample (key frame for video)
  719.     nextTimeEdgeOK - if the thing you are looking for (sample, mediaEdit, trackEdit, 
  720.                      or SyncSample) at the "time" you pass in, that time can be returned.  An
  721.                      example is when you want to get the first TrackEdit.  It starts at time zero,
  722.                      so you can pass in time=0 and nextTimeEdgeOK, and you will get back
  723.                      0 in interestingTime and the duration of the TrackEdit in interestingDuration.
  724.     nextTimeIgnoreActiveSegment - if this flag is set, you can get times outside of the Active Segment.
  725.     
  726.     If you go off either end of the movie/track/media, the interestingTime returned is == -1 and the
  727.     duration is meaningless.
  728.     
  729.     GetMediaNextInterestingTime ignores the nextTimeTrackEdit and nextTimeIgnoreActiveSegment flags.
  730.  
  731.  
  732. TRACK ALTERNATES
  733.  
  734.     The usage of alternate groups has been reworked.  
  735.  
  736.     Instead of alternate groups being of a particular type (i.e. language or
  737.     quality), they are just a big group of movies. Language is always the most important critera when
  738.     the toolbox selects which track to enable from the group. Reselection of the active track in each
  739.     alternate group occurs when the following calls are made: SetMovieLanguage, UpdateMovie,
  740.     SetMovieGWorld, SetMovieBox, or the new SelectMovieAlternates. The reselection process examines
  741.     each track in the alternate group and chooses the best one. The last movie language set is used
  742.     to choose the language. If multiple tracks exist with the same language, media quality
  743.     is examined.  From there, media quality is examined.
  744.     
  745.     
  746.     The low 6 bits of media quality are a bit map. Each bit corresponds to a bit depth. If a bit is 
  747.     set, it means that the media is “good” to use at that depth. Multiple bit depths can be set for 
  748.     a single track. After choosing the language of the alternate group, the toolbox attempts to choose 
  749.     a track whose bit depth best matches the depth it is being displayed into. 
  750.  
  751.     The low six media quality bits are always bit depth flags. This is even true for sound 
  752.     tracks, which is somewhat bizarre but does allow you to tie video and sound tracks together across 
  753.     bit depth selections. If you set none of the bit depth flags, it means that the track will be 
  754.     selected if no track for the specific bit depth is available (esentially it makes the track the 
  755.     “default”). The next two bits up are defined to be a "quality level" -- 0 being worst and 3 being 
  756.     the best. If two or more tracks could be selected from a given alternate group (i..e their languages 
  757.     are the same, and they are both valid at the current bit depth), then we choose the track of the 
  758.     highest quality that will play back well. To do this, we call the media handler of each track and 
  759.     ask it how well it can play back the track on the current machine. We then choose the track of the 
  760.     highest available quality that will playback with the best performance.
  761.  
  762.     To make all this work for choosing between a 16 bit and an 8 bit sound track, you could set the 
  763.     quality for the 16 bit track to 0x0040 and to 0x0000 for the 8 bit track. On a machine that only 
  764.     supports 8 bit output, the sound media handler will only be able to play back half of the 16 bit 
  765.     data, so it chooses the 8 bit track. On a machine that supported 16 bit audio output (speculation 
  766.     left to the reader), the sound media handler would be able to play back all of the 16 bit or 8 bit 
  767.     data, but since the 16 bit track was marked as being of higher quality, the 16 bit track would be 
  768.     selected.
  769.  
  770.     There are two calls for alternate group support. SetAutoTrackAlternatesEnabled allows you to 
  771.     turn off the automatic reselection of alternate tracks that occurs in certain toolbox calls. 
  772.     A reselection is done when you enable auto-alternates with SetAutoTrackAlternatesEnabled.
  773.     Currently these calls are UpdateMovie, SetMovieGWorld, and SetMovieBox. If the bit-depth did
  774.     not change, these calls will perform a reselection.  This list of calls may change 
  775.     in the future. The default is for auto track alternate selection to be on (true). If you wish to 
  776.     select alternate tracks using your own criteria, you may want to disable this features. 
  777.     SelectMovieAlternates makes the movie toolbox perform its alternate track enabling algorthim on 
  778.     the given movie. If automatic alternate selection is enabled, you should never need to call 
  779.     SelectMovieAlternates.  If you disable auto alternates for a movie, you most likely want to
  780.     open it in this state.  To do this, use the newMovieDontAutoAlternate flag when you instantiate
  781.     a movie. (see the NewMovie… calls)
  782.     
  783.     SetMovieLanguage performs a track reselection.  If auto alternates are disabled, only those 
  784.     alternate groups which contain a track matching the language are effected.
  785.  
  786.     If no tracks of an alternate group are enabled, no tracks of the group will be enabled by
  787.     an alternate track reselection operation.
  788.     
  789.     
  790.     
  791.         ----------
  792.     
  793.         ADDED:  pascal void SelectMovieAlternates(Movie m)
  794.         
  795.         ADDED:  pascal void EnableAutoTrackAlternates(Movie m, Boolean enable)
  796.     
  797.         ----------
  798.     
  799.         GONE:  pascal void SetMovieQuality( Movie m, short quality )
  800.     
  801.         ----------
  802.     
  803.  
  804.  
  805.  
  806.  
  807.  
  808. CALLS WHICH CHANGED
  809.  
  810.  
  811. Added a new constant to the QTCallBackFlags. "triggerRateChange" allows you to specify that a 
  812.     rate change callback should fire on any rate change.
  813.  
  814. The following calls interfaces' changed in response to testing requests. They also now return
  815.     a reasonable creatorName.
  816.     pascal void GetMediaHandlerDescription( Media m, OSType *mediaType, Str255 creatorName, OSType *creatorManufacturer );
  817.     pascal void GetMediaDataHandlerDescription( Media m, OSType *type, Str255 creatorName, OSType *creatorManufacturer );
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.                             M  A  T  R  I  X       R  O  U  T  I  N  E  S
  825.  
  826.  
  827.     The matrix routines went through a major overhaul.  The calls that anyone were likely to use did
  828.     not change (SetMatrixIdentity, TranslateMatrix, ScaleMatrix).
  829.  
  830.         ----------
  831.     
  832.         OLD:  pascal void ConcatMatrix( MatrixRecord *outP, MatrixRecord *bP, MatrixRecord *aP );
  833.                                         ------------------
  834.         NEW:  pascal void ConcatMatrix( MatrixRecord *a, MatrixRecord *b);    
  835.         
  836.         ----------
  837.     
  838.         OLD: pascal Boolean InvertMatrix( MatrixRecord *mp ); 
  839.         NEW: pascal Boolean InverseMatrix( MatrixRecord *m, MatrixRecord *im );    
  840.                                                             ^^^^^^^^^^^^^^^^
  841.         ----------
  842.     
  843.         OLD:  pascal void    TransformFixedPoints(MatrixRecord *m, short count, FixedPoint *fpt);        
  844.         NEW:  pascal OSErr    TransformFixedPoints(MatrixRecord *m, FixedPoint *fpt, long count);
  845.                      ^^^^^                                          ^^^^^^^^^^^^^^^  ^^^^^^^^^^
  846.         ----------
  847.     
  848.         OLD:  pascal void     TransformPoints( MatrixRecord *mp, short count, Point *pt1 );
  849.         NEW:  pascal OSErr    TransformPoints( MatrixRecord *mp, Point *pt1, long count );
  850.                      ^^^^^                                       ^^^^^^^^^^  ^^^^^^^^^^
  851.         ----------
  852.     
  853.         OLD:  pascal Boolean TransformRect( MatrixRecord *m, Rect *r );
  854.         NEW:  pascal Boolean TransformRect( MatrixRecord *m, Rect *r, FixedPoint *fpp);    
  855.                                                                       ^^^^^^^^^^^^^^^
  856.         ----------
  857.  
  858.         OLD:  pascal void  TransformRgn( MatrixRecord *mp, RgnHandle r );
  859.         NEW:  pascal OSErr TransformRgn( MatrixRecord *mp, RgnHandle r );    
  860.                      ^^^^^
  861.         ----------
  862.         
  863.     - The usage of ConcatMatrix is:
  864.         Multiply matrix A with matrix B and return result in B (B = B * A).
  865.             (This is not a commutative operation.)
  866.     - InvertMatrix is now InverseMatrix which takes two matrices instead of one and returns a boolean
  867.         indicating whether or not an inverse was found.
  868.     - TransformFixedPoints and TransformPoints now returns an OSErr and takes a long for the point count,
  869.         and the parameter ordering changed
  870.     - TransformRect takes an additional parameter which is a pointer to four 'FixedPoint's.  If the
  871.         pointer is nil, no points are returned.  If the matrix is less than linear (only scale & translate),
  872.         true is returned.  Otherwise, the rect returned is the bounding box of the transformed rect and
  873.         the points of the rect are returned in fpp.
  874.     - TransformRgn now returns an OSErr.
  875.     
  876.         ----------
  877.     
  878.         ADDED:  pascal short    GetMatrixType(MatrixRecord *m);         
  879.         ADDED:  pascal void        CopyMatrix(MatrixRecord *m1, MatrixRecord *m2);
  880.         ADDED:  pascal Boolean    EqualMatrix(MatrixRecord *m1, MatrixRecord *m2);
  881.         ADDED:  pascal void        SkewMatrix(MatrixRecord *m, Fixed skewX, Fixed skewY, Fixed aboutX, Fixed aboutY);    
  882.         ADDED:  pascal Boolean    TransformFixedRect(MatrixRecord *m, FixedRect *fr, FixedPoint *fpp);
  883.         ADDED:  pascal void        AlignMatrix(register MatrixRecord *mrp, Rect *srcRect);    
  884.         
  885.         ----------
  886.  
  887.     - Given a matrix pointer GetMatrixType returns a number indicating the complexity of the matrix.
  888.             [identity, translate, scale, linear (general 2x2), perspective (general 3x3)]      
  889.     - CopyMatrix and EqualMatrix were added.  They are simple matrix utility routines.
  890.     - SkewMatrix was added.  It's along the same lines as ScaleMatrix, RotateMatrix, etc.
  891.     - TransformFixedRect transforms a FixedRect.  If the matrix is less than linear (only scale & translate),
  892.         true is returned.  Otherwise, the rect returned is the bounding box of the transformed rect and
  893.         the points of the rect are returned in fpp.  If you don't want the points, pass nil for fpp.
  894.     - AlignMatrix adjusts the matrix so that the top-left of the srcRect is the same
  895.         after transforming the srcRect through the matrix.
  896.         
  897.         
  898.         ----------
  899.  
  900.         GONE:  psacal void GetMatrixTranslate( MatrixRecord *m, Fixed *deltaH, Fixed *deltaV );
  901.         GONE:  pascal void GetMatrixScale( MatrixRecord *m, Fixed *hscale, Fixed *vscale );
  902.         GONE:  pascal void ScaleMatrixTo( MatrixRecord *m, Fixed scaleX, Fixed scaleY );
  903.         GONE:  pascal void TransformPoint( MatrixRecord *mp, short *y, short *x );
  904.         GONE:  pascal void TransformMatrix( MatrixRecord *inouP, MatrixRecord *aP );
  905.         GONE:  pascal Boolean GetMatrixRect( MatrixRecord *matrix, Rect *dstRect );
  906.  
  907.         ----------
  908.  
  909.     The above routines are gone.  
  910.     - GetMatrixTranslate and GetMatrixScale were never full implementations.
  911.     - ScaleMatrixTo was not a general routine
  912.     - You can use TransformPoints instead of TransformPoint
  913.  
  914.  
  915.  
  916.  
  917.                         I  M  A  G  E     C  O  M  P  R  E  S  S  I  O  N
  918.  
  919.  
  920. The biggest changes to image compression involve parameters changing from unsigned longs
  921. to longs and all callout procs now take refcons.  This impacts you in two ways, depending
  922. on the level of typechecking you employ, you will have to redeclare variables as long instead
  923. of unsigned long (the compiler will tell you all about it).
  924.  
  925. The addition of refcons to the callout procs only affect you if are using callout procs.
  926. Instead of a proc ptr, the routines now take a pointer to a proc record.  The proc record
  927. contains the proc ptr and the refcon.  Since the refcon is not a parameter, if you used to
  928. pass nil for the proc ptr, you still pass nil for the proc record ptr.
  929.  
  930.     unsigned long ==> long
  931.  
  932.     DataProcPtr ==> DataProcRecordPtr
  933.         typedef pascal OSErr (*DataProcPtr)(Ptr *dataP,long bytesNeeded,long refcon);
  934.                                                                         ^^^^^^^^^^^
  935.     FlushProcPtr ==> FlushProcRecordPtr
  936.         typedef pascal OSErr (*FlushProcPtr)(Ptr data,long bytesAdded,long refcon);
  937.                                                                       ^^^^^^^^^^^
  938.     CompletionProcPtr ==> CompletionProcRecordPtr
  939.         typedef pascal void (*CompletionProcPtr)(OSErr result,short flags,long refcon);
  940.                                                                           ^^^^^^^^^^^
  941.     ProgressProcPtr ==> ProgressProcRecordPtr
  942.         typedef pascal OSErr (*ProgressProcPtr)(short message,Fixed completeness,long refcon);
  943.                                                                                  ^^^^^^^^^^^
  944.  
  945. The resvd3 field in ImageDescription now contains frameCount.
  946.  
  947.     ----------
  948.  
  949.     OLD:  SetDSequenceTransferMode(ImageSequence seqID,short mode)
  950.     NEW:  SetDSequenceTransferMode(ImageSequence seqID,short mode,RGBColor *opColor)
  951.                                                                   ^^^^^^^^^^^^^^^^^
  952.     ----------
  953.     
  954.     OLD:  GetSimilarity(PixMapHandle src,Rect *srcRect,ImageDescriptionHandle desc,Ptr data,
  955.                         unsigned char *similarity)
  956.     NEW:  GetSimilarity(PixMapHandle src,Rect *srcRect,ImageDescriptionHandle desc,Ptr data,
  957.                         Fixed *similarity)
  958.                         ^^^^^
  959.     ----------
  960.     
  961.     OLD:  GetImageDescriptionExtension(ImageDescriptionHandle desc,Handle *extension)
  962.     NEW:  GetImageDescriptionExtension(ImageDescriptionHandle desc,Handle *extension,
  963.                                                                         long type,long index)
  964.                                                                         ^^^^^^^^^ ^^^^^^^^^^
  965.     ----------
  966.     
  967.     OLD:  SetImageDescriptionExtension(ImageDescriptionHandle desc,Ptr extension, long size) 
  968.                                                                                   ---------
  969.     NEW:  SetImageDescriptionExtension(ImageDescriptionHandle desc,Handle extension, long type) 
  970.                                                                    ^^^^^^             ^^^^^^^^^
  971.     ----------
  972.     
  973.     OLD:  GetCompressionSize(PixMapHandle src,Rect *srcRect, short colorDepth,CodecQ quality,
  974.                                     CodecType cType,CompressorComponent codec,unsigned long *size)
  975.                                                                               --------              
  976.     NEW:  GetMaxCompressionSize(PixMapHandle src,Rect *srcRect, short colorDepth,CodecQ quality,
  977.              ^^^                    CodecType cType,CompressorComponent codec,long *size)
  978.                 
  979.     ----------
  980.     
  981.     ADDED:  pascal OSErr GetCompressedPixMapInfo(PixMapPtr pix,ImageDescriptionHandle *desc,
  982.                             Ptr *data,long *bufferSize,
  983.                             DataProcRecord *dataProc,ProgressProcRecord *progressProc)
  984.     
  985.     ADDED:  pascal OSErr SetCompressedPixMapInfo(PixMapPtr pix,ImageDescriptionHandle desc,
  986.                             Ptr data,long bufferSize,
  987.                             DataProcRecordPtr dataProc,ProgressProcRecordPtr progressProc)
  988.     
  989.     ----------
  990.     
  991. SetDSequenceTransferMode now takes the opColor for the transfer mode.  This is required to fully
  992. specify the transfer mode (opColor is required for arithmetic operations such as blend).
  993.     
  994. GetImageDescription and SetImageDescription are routines which allow additional information
  995. to be attached to Image Descriptions.  Get returns the nth extension.  Each extension has a type 
  996. so you know how to interpret it.
  997.  
  998. GetCompressedPixMapInfo and SetCompressedPixMapInfo are utility routines for those of you using
  999. the new StdPix bottleneck for Pictures.
  1000.  
  1001.  
  1002.  
  1003.  
  1004.  
  1005.                                     J P E G   C O D E C
  1006.                                     
  1007.                                     
  1008. The version of the JPEG compressor from the alpha release had several significant defects. One was
  1009. that the pixels values were not level shifted before encoding, resulting in strangely colored
  1010. images. Another was a problem when generating certain high quality images, the compressed data was
  1011. not in compliance with the standard. Both of these are corrected in the Beta version. 
  1012. Since the data created with  the alpha version is not compatible with  the new JPEG decompressor,
  1013. the commpression type has been changed from 'JPEG' to 'jpeg'. There is a decompressor in the Beta 
  1014. release which can decode the alpha version of JPEG data, but this will not be supported in future
  1015. releases. Any images created with the alpha version of the JPEG compressor should be recreated from
  1016. the originals, or if that is not possible, by recompressing them from the alpha-compatibility 
  1017. JPEG decoder. Note that since these bugs were not fixed all at once, JPEG images created with
  1018. releases of QuickTime between alpha nad beta may not decode correctly with either JPEG decompressor, 
  1019. but this only affects people who were seeded with those intermediate releases.
  1020.  
  1021.  
  1022.                                 I  M  A  G  E      C  O  D  E  C
  1023.  
  1024. The interface for implementing codecs changed dramatically.  There were no conceptual changes
  1025. to the way the codecs work, instead the changes involve the interface to the codecs.  The change
  1026. from unsigned long to long in Image Compression is carried through to the codec interface.  Also
  1027. the addition of refcons for all callout procs is also now apparent in the codec interface.  Instead
  1028. of pushing lots of parameters onto the stack for the PreCompress, BandCompress, PreDecompress,
  1029. and BandDecompress, pointers to parameter blocks for these routines are passed.
  1030.  
  1031. There is no longer a PostCompress or PostDecompress call.  Instead there is a flag telling you
  1032. that you are on the last band.  If both first and last band bits are set, this will be the only
  1033. call to BandDe/compress.
  1034.  
  1035. Selectors were added to support codecGetCompressedPixMapInfo and codecSetCompressedPixMapInfo.
  1036.  
  1037. The selector numbers for codecPreCompress, codecBandCompress, codecPreDecompress, and
  1038. codecBandDecompress, changed.  As mentioned above, the selectors for codecPostCompress
  1039. and codecPostDecompress have gone away.  Also, all the selectors for convert are gone.
  1040.  
  1041. The capability flags changed in the following way:
  1042.  
  1043.  
  1044.     typedef    struct {
  1045.         long    flags;
  1046.         short    wantedPixelSize;
  1047.         short    extendWidth;
  1048.         short    extendHeight;
  1049.         short    bandMin;
  1050.         short    bandInc;
  1051.         long    time;            ====>    short    pad;
  1052.                                 ====>    unsigned long    time;
  1053.     
  1054.     } CodecCapabilities;
  1055.  
  1056. The CodecCapabilities struct now has a pad byte to long align the time field.  The time
  1057. field is now an unsigned value.
  1058.  
  1059.  
  1060. The parameter block for the compress calls is:
  1061.     
  1062.     typedef    struct {    
  1063.         ImageSequence             sequenceID;
  1064.         ImageDescriptionHandle     imageDescription;
  1065.         Ptr                     data;
  1066.         long                     bufferSize;
  1067.         long                     frameNumber;
  1068.         long                     startLine;
  1069.         long                     stopLine;
  1070.         short                    conditionFlags;
  1071.         CodecFlags                 callerFlags;
  1072.         CodecCapabilities         *capabilities;
  1073.         ProgressProcRecord        progressProcRecord;
  1074.         CompletionProcRecord    completionProcRecord;    
  1075.         FlushProcRecord         flushProcRecord;
  1076.     
  1077.         PixMap                     srcPixMap;
  1078.         PixMap                     prevPixMap;
  1079.         CodecQ                     spatialQuality;
  1080.         CodecQ                     temporalQuality;
  1081.         Fixed                     similarity;
  1082.         long                    reserved[2];
  1083.     } CodecCompressParams;
  1084.     
  1085.     ----------
  1086.     
  1087.     OlD:  pascal ComponentResult CDBandCompress(ImageSequence seqID,
  1088.                                                 -------------------
  1089.                 ImageDescriptionHandle desc,Ptr data,unsigned long *dataSize,
  1090.                 --------------------------- -------- -----------------------
  1091.                 FlushProcPtr flushProc,PixMapPtr src,PixMapPtr prev,CodecQ spatialQ,
  1092.                 ---------------------- ------------- -------------- ---------------
  1093.                 CodecQ temporalQ,sBoolean firstBandInFrame,long frameNum,short startLine,
  1094.                 ---------------- ------------------------- ------------- ---------------
  1095.                 short stopLine,CodecFlags flags,CompletionProcPtr asyncProc)
  1096.                 -------------- ---------------- ---------------------------
  1097.     NEW:  pascal ComponentResult CDBandCompress(CodecCompressParams *params)
  1098.                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1099.     ----------
  1100.  
  1101.     OlD:  pascal ComponentResult CDPreCompress(ImageSequence seqID,ImageDescriptionHandle desc,
  1102.                                                ------------------- ---------------------------
  1103.                 short pixelSize,CodecCapabilities *capabilites)
  1104.                 --------------- ------------------------------
  1105.     NEW:  pascal ComponentResult CDPreCompress(CodecCompressParams *params)
  1106.                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1107.     ----------
  1108.     
  1109.     GONE:  pascal ComponentResult CDPostCompress(PREAMBLE,ImageSequence seqID,
  1110.                 ImageDescriptionHandle desc,unsigned char *similarity,long *totalSize)
  1111.     ----------
  1112.  
  1113.  
  1114. The parameter block for the decompress calls is:
  1115.  
  1116.     typedef    struct {    
  1117.         ImageSequence             sequenceID;
  1118.         ImageDescriptionHandle     imageDescription;
  1119.         Ptr                     data;
  1120.         long                     bufferSize;
  1121.         long                     frameNumber;
  1122.         long                     startLine;
  1123.         long                     stopLine;
  1124.         short                    conditionFlags;
  1125.         CodecFlags                 callerFlags;
  1126.         CodecCapabilities         *capabilities;
  1127.         ProgressProcRecord        progressProcRecord;
  1128.         CompletionProcRecord    completionProcRecord;
  1129.         DataProcRecord            dataProcRecord;
  1130.     
  1131.         CGrafPtr                 port;
  1132.         PixMap                     dstPixMap;
  1133.         BitMapPtr                 maskBits;
  1134.         PixMapPtr                 mattePixMap;
  1135.         Rect                     srcRect;
  1136.         MatrixRecord             *matrix;
  1137.         CodecQ                     accuracy;
  1138.         short                     transferMode;
  1139.         long                    reserved[2];
  1140.     } CodecDecompressParams;
  1141.     
  1142.  
  1143.     ----------
  1144.     
  1145.     OLD:  pascal pascal ComponentResult CDBandDecompress(ImageSequence seqID,
  1146.                                                          -------------------
  1147.             CGrafPtr port,ImageDescriptionHandle desc,Ptr *data,unsigned long dataSize,
  1148.             ------------- --------------------------- --------- ----------------------
  1149.             DataProcPtr dataProc, Rect *srcRect,short mode,CodecQ accuracy,PixMapPtr dst,
  1150.             --------------------  ------------- ---------- --------------- -------------
  1151.             MatrixRecordPtr matrix,BitMap *maskBits,PixMapPtr matte, sBoolean firstBandInFrame,
  1152.             ---------------------- ---------------- ---------------  -------------------------
  1153.             long frameNum,short startLine,short stopLine,Boolean *changedMask,CodecFlags flags,
  1154.             ------------- --------------- -------------- -------------------- ----------------
  1155.             CompletionProcPtr asyncProc)
  1156.             ---------------------------
  1157.     NEW:  pascal ComponentResult CDPreDecompress(CodecDecompressParams *params)
  1158.                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1159.     ----------
  1160.     OLD:  pascal ComponentResult CDPreDecompress(ImageSequence seqID,
  1161.                                                  -------------------
  1162.                 CGrafPtr port,ImageDescriptionHandle desc, Rect *srcRect,PixMapPtr dst,
  1163.                 ------------- ---------------------------  ------------- -------------
  1164.                 MatrixRecordPtr matrix,short mode, CodecQ accuracy, 
  1165.                 ---------------------- ----------  ---------------
  1166.                 CodecCapabilities *capabilities)
  1167.                 -------------------------------
  1168.  
  1169.     NEW:  pascal ComponentResult CDBandDecompress(CodecDecompressParams *params)
  1170.                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  1171.     ----------
  1172.     
  1173.     OLD:  pascal ComponentResult CDGetCompressionSize(PixMapHandle src, Rect *srcRect, 
  1174.                         short depth, CodecQ quality, unsigned long *size)
  1175.                                                      --------
  1176.     NEW:  pascal ComponentResult CDGetMaxCompressionSize(PixMapHandle src, Rect *srcRect, 
  1177.                                       ^^^
  1178.                         short depth, CodecQ quality, long *size)
  1179.  
  1180.     ----------
  1181.     
  1182.     OLD:  pascal ComponentResult CDGetSimilarity(PixMapHandle src, Rect *srcRect,
  1183.                         ImageDescriptionHandle desc, Ptr data, unsigned char *similarity)
  1184.                                                                -------------
  1185.     NEW:  pascal ComponentResult CDGetSimilarity(PixMapHandle src, Rect *srcRect,
  1186.                         ImageDescriptionHandle desc, Ptr data, Fixed *similarity)
  1187.                                                                ^^^^^
  1188.     ----------
  1189.     
  1190.     GONE:  pascal ComponentResult CDPostDecompress(PREAMBLE,ImageSequence seqID,
  1191.                 ImageDescriptionHandle desc)
  1192.     ----------
  1193.  
  1194.  
  1195. The utility routines to assist Think C users in calling the proc ptrs are gone.  Think C version 5
  1196. solves this problem.
  1197.  
  1198.     ----------
  1199.  
  1200.     GONE:  pascal OSErr CallDataProc(Ptr *p,long size,DataProcPtr proc)
  1201.  
  1202.     GONE:  pascal OSErr CallFlushProc(Ptr p,long size,FlushProcPtr proc)
  1203.  
  1204.     GONE:  pascal OSErr CallProgressProc(unsigned char progress,ProgressProcPtr proc)
  1205.  
  1206.     GONE:  pascal void CallCompletionProc(OSErr result,CompletionProcPtr proc)
  1207.  
  1208.     ----------
  1209.  
  1210.                     C  O  M  P  O  N  E  N  T       M  A  N  A  G  E  R
  1211.                     
  1212.  
  1213. The DelegateComponent call cannot accept a Component Reference.  DelegateComponent must 
  1214. be called with a Component Instance.
  1215.  
  1216. Added the following convenience call.
  1217.  
  1218.     ----------
  1219.     
  1220.     NEW:    pascal ComponentInstance OpenDefaultComponent( long componentType, long componentSubType );
  1221.     
  1222.     ----------
  1223.     
  1224. This call finds and opens the first component of the Type,SubType specified.  If the first one
  1225. found fails to open then it keeps looking until it finds one that will open or it runs out
  1226. of things to open.
  1227.  
  1228.  
  1229.                                         ----------
  1230.                                     
  1231.                                     PREVIEW COMPONENTS
  1232.                                     
  1233. Thumbnails.c and Thumbnails.h are now obsolete.  Instead, preview information should
  1234. be created/added to files using the PICT Preview Component or the Movie Preview Componnent.
  1235. You may also define your own type of preview component to add custom previews to
  1236. documents and to show those previews in Standard File.  See PreviewComponent.h.
  1237.  
  1238.                                         ----------
  1239.                                     
  1240.                                 Previewing in StandardFile
  1241.  
  1242. Preview-capable versions of StandardGetFile and CustomGetFile have been defined: they
  1243. are called StandardGetFilePreview and CustomGetFilePreview.  Custom... may only be used
  1244. under System 7.0, whereas StandardGetFilePreview may be used under either system 6 or
  1245. system 7.
  1246.  
  1247. The routines make use of any registered preview components to show previews for files.
  1248.  
  1249. Both routines are identical to their namesakes except that the dialog box used for them
  1250. must contain five additional standard dialog items.  See StandardPreview.h.
  1251.  
  1252.  
  1253.  
  1254.                                         ----------
  1255.                                     
  1256.                                M O V I E   C O N T R O L L E R
  1257.  
  1258. 22 August 1991
  1259. 29 August 1991
  1260.  
  1261. GONE:  The following mcActions have been removed:
  1262.         mcStop, mcPlayBackwards, mcSetRate, mcIncreaseRate, mcDecreaseRate
  1263.             use mcPlay instead
  1264.         
  1265.         mcStepForward, mcStepBackward 
  1266.             use mcStep instead
  1267.         
  1268.         mcToggleLooping
  1269.             use mcGetLooping and mcSetLooping
  1270.         
  1271.         mcIncreaseVolume, mcDecreaseVolume
  1272.             use mcGetVolume and mcSetVolume
  1273.         
  1274.         mcSetSelectionBegin, mcSetSelectionEnd
  1275.             changed to mcSetSelectionBegin and mcSetSelectionDuration, with the behaviour that mcSetSelectionBegin does nothing, just saves the time passed, and mcSetSelectionDuration then applies the beginning and the duration to the movie. Also, the duration can be negative.
  1276.  
  1277. ADDED:
  1278.     New Actions: mcSetUseBadge and mcGetUseBadge - which take, for the parameter,
  1279.         a Boolean and a pointer-to-Boolean, respectively, to enable the use of badges to play the movie.
  1280.         The badge appears whenever the movie is stopped, the controller visible, and badges enabled.
  1281.  
  1282.     New Actions mcSetFlags and mcGetFlags - which take, as a parameter,
  1283.         a long of bits, or a pointer to a long of bits, respectively.
  1284.         The following bits are defined:
  1285.  
  1286.             typedef enum
  1287.                 {
  1288.                 mcFlagSuppressMovieFrame = 1<<0,        Don't frame movie with a single pixel border
  1289.                 mcFlagSuppressStepButtons = 1<<1,        Don't draw the left/right step buttons
  1290.                 mcFlagSuppressSpeakerButton = 1<<2        Don't draw the speaker-mute button
  1291.                 } mcFlags;
  1292.  
  1293.         To change a single flag, you must get the flags long, alter it, and set the flags.
  1294.  
  1295. CHANGED:
  1296.   
  1297.     MCShowHide -> MCSetVisible (name change only)
  1298.     MCIsShowing -> MCGetVisible (name change only)
  1299.     
  1300.     The MovieController is no longer defined to support multiple movies; the following calls are affected:
  1301.     
  1302.     MCAddMovie -> MCSetMovie, where setting movie “nil” removes a movie from the controller.
  1303.     
  1304.     MCRemoveMovie goes away.
  1305.     
  1306.     MCGetIndMovie -> MCGetMovie, and takes only the single MovieController parameter; no index.
  1307.     
  1308.     MCRemoveAllMovies goes away.
  1309.     
  1310.     MCGetControllerBoundsRect and MCGetControllerBoundsRgn are redefined to return
  1311.     the areas of the controller, and the movie, if one is set to the controller and attached.
  1312.     
  1313.     Similarly, MCSetControllerBoundsRect will resize the movie and the controller,
  1314.     if there is a movie and it is attached.
  1315.